package com.rj.bd.kj.fdc.rsa;

import com.rj.bd.kj.utils.MyExceptionUtils;

import java.security.KeyPair;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.KeyFactory;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;

/**
 * @desc RSA工具类
 */
public class RSAUtils {

    // 将私钥的字节数组转换为PrivateKey对象
    // 输入为私钥字节数组，输出为对应的PrivateKey对象，过程中可能抛出异常
    public static PrivateKey getPrivateKey(byte[] privateKeyBytes) throws Exception {
        // 根据私钥字节数组创建PKCS8EncodedKeySpec对象，这是私钥的一种编码规范
        PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
        // 获取RSA密钥工厂实例，用于生成密钥对象
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        // 使用密钥工厂和编码规范生成私钥对象并返回
        return keyFactory.generatePrivate(keySpec);
    }

    // 将公钥的字节数组转换为PublicKey对象
    // 输入为公钥字节数组，输出为对应的PublicKey对象，过程中可能抛出异常
    public static PublicKey getPublicKey(byte[] publicKeyBytes) throws Exception {
        // 根据公钥字节数组创建X509EncodedKeySpec对象，这是公钥的一种编码规范
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
        // 获取RSA密钥工厂实例
        KeyFactory keyFactory = KeyFactory.getInstance("RSA");
        // 使用密钥工厂和编码规范生成公钥对象并返回
        return keyFactory.generatePublic(keySpec);
    }

    // 将私钥转换为Base64编码的字符串
    // 输入为PrivateKey对象，输出为Base64编码的私钥字符串，过程中可能抛出异常
    public static String privateKeyToString(PrivateKey privateKey) throws Exception {
        byte[] privateKeyBytes = privateKey.getEncoded();
        String base64Str = Base64.getEncoder().encodeToString(privateKeyBytes);
        // 移除Base64字符串末尾多余的填充字符
        while (base64Str.endsWith("=")) {
            base64Str = base64Str.substring(0, base64Str.length() - 1);
        }
        return base64Str;
    }

    // 将公钥转换为Base64编码的字符串
    // 输入为PublicKey对象，输出为Base64编码的公钥字符串，过程中可能抛出异常
    public static String publicKeyToString(PublicKey publicKey) throws Exception {
        // 获取公钥的字节数组
        byte[] publicKeyBytes = publicKey.getEncoded();
        // 使用Base64编码器将公钥字节数组转换为字符串并返回
        return Base64.getEncoder().encodeToString(publicKeyBytes);
    }


}